{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM——Otto商品分类\n",
    "\n",
    "我们以Kaggle 2015年举办的Otto Group Product Classification Challenge竞赛数据为例，SVC、SVC + GridSearchCV进行参数调优。\n",
    "\n",
    "Otto数据集是著名电商Otto提供的一个多类商品分类问题，类别数=9. 每个样本有93维数值型特征（整数，表示某种事件发生的次数，已经进行过脱敏处理）。 竞赛官网：https://www.kaggle.com/c/otto-group-product-classification-challenge/data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>feat_1</th>\n",
       "      <th>feat_2</th>\n",
       "      <th>feat_3</th>\n",
       "      <th>feat_4</th>\n",
       "      <th>feat_5</th>\n",
       "      <th>feat_6</th>\n",
       "      <th>feat_7</th>\n",
       "      <th>feat_8</th>\n",
       "      <th>feat_9</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_85</th>\n",
       "      <th>feat_86</th>\n",
       "      <th>feat_87</th>\n",
       "      <th>feat_88</th>\n",
       "      <th>feat_89</th>\n",
       "      <th>feat_90</th>\n",
       "      <th>feat_91</th>\n",
       "      <th>feat_92</th>\n",
       "      <th>feat_93</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>Class_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>Class_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>Class_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>Class_1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>Class_1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 95 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  feat_1  feat_2  feat_3  feat_4  feat_5  feat_6  feat_7  feat_8  feat_9  \\\n",
       "0   1       1       0       0       0       0       0       0       0       0   \n",
       "1   2       0       0       0       0       0       0       0       1       0   \n",
       "2   3       0       0       0       0       0       0       0       1       0   \n",
       "3   4       1       0       0       1       6       1       5       0       0   \n",
       "4   5       0       0       0       0       0       0       0       0       0   \n",
       "\n",
       "    ...     feat_85  feat_86  feat_87  feat_88  feat_89  feat_90  feat_91  \\\n",
       "0   ...           1        0        0        0        0        0        0   \n",
       "1   ...           0        0        0        0        0        0        0   \n",
       "2   ...           0        0        0        0        0        0        0   \n",
       "3   ...           0        1        2        0        0        0        0   \n",
       "4   ...           1        0        0        0        0        1        0   \n",
       "\n",
       "   feat_92  feat_93   target  \n",
       "0        0        0  Class_1  \n",
       "1        0        0  Class_1  \n",
       "2        0        0  Class_1  \n",
       "3        0        0  Class_1  \n",
       "4        0        0  Class_1  \n",
       "\n",
       "[5 rows x 95 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"Otto_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 61878 entries, 0 to 61877\n",
      "Data columns (total 95 columns):\n",
      "id         61878 non-null int64\n",
      "feat_1     61878 non-null int64\n",
      "feat_2     61878 non-null int64\n",
      "feat_3     61878 non-null int64\n",
      "feat_4     61878 non-null int64\n",
      "feat_5     61878 non-null int64\n",
      "feat_6     61878 non-null int64\n",
      "feat_7     61878 non-null int64\n",
      "feat_8     61878 non-null int64\n",
      "feat_9     61878 non-null int64\n",
      "feat_10    61878 non-null int64\n",
      "feat_11    61878 non-null int64\n",
      "feat_12    61878 non-null int64\n",
      "feat_13    61878 non-null int64\n",
      "feat_14    61878 non-null int64\n",
      "feat_15    61878 non-null int64\n",
      "feat_16    61878 non-null int64\n",
      "feat_17    61878 non-null int64\n",
      "feat_18    61878 non-null int64\n",
      "feat_19    61878 non-null int64\n",
      "feat_20    61878 non-null int64\n",
      "feat_21    61878 non-null int64\n",
      "feat_22    61878 non-null int64\n",
      "feat_23    61878 non-null int64\n",
      "feat_24    61878 non-null int64\n",
      "feat_25    61878 non-null int64\n",
      "feat_26    61878 non-null int64\n",
      "feat_27    61878 non-null int64\n",
      "feat_28    61878 non-null int64\n",
      "feat_29    61878 non-null int64\n",
      "feat_30    61878 non-null int64\n",
      "feat_31    61878 non-null int64\n",
      "feat_32    61878 non-null int64\n",
      "feat_33    61878 non-null int64\n",
      "feat_34    61878 non-null int64\n",
      "feat_35    61878 non-null int64\n",
      "feat_36    61878 non-null int64\n",
      "feat_37    61878 non-null int64\n",
      "feat_38    61878 non-null int64\n",
      "feat_39    61878 non-null int64\n",
      "feat_40    61878 non-null int64\n",
      "feat_41    61878 non-null int64\n",
      "feat_42    61878 non-null int64\n",
      "feat_43    61878 non-null int64\n",
      "feat_44    61878 non-null int64\n",
      "feat_45    61878 non-null int64\n",
      "feat_46    61878 non-null int64\n",
      "feat_47    61878 non-null int64\n",
      "feat_48    61878 non-null int64\n",
      "feat_49    61878 non-null int64\n",
      "feat_50    61878 non-null int64\n",
      "feat_51    61878 non-null int64\n",
      "feat_52    61878 non-null int64\n",
      "feat_53    61878 non-null int64\n",
      "feat_54    61878 non-null int64\n",
      "feat_55    61878 non-null int64\n",
      "feat_56    61878 non-null int64\n",
      "feat_57    61878 non-null int64\n",
      "feat_58    61878 non-null int64\n",
      "feat_59    61878 non-null int64\n",
      "feat_60    61878 non-null int64\n",
      "feat_61    61878 non-null int64\n",
      "feat_62    61878 non-null int64\n",
      "feat_63    61878 non-null int64\n",
      "feat_64    61878 non-null int64\n",
      "feat_65    61878 non-null int64\n",
      "feat_66    61878 non-null int64\n",
      "feat_67    61878 non-null int64\n",
      "feat_68    61878 non-null int64\n",
      "feat_69    61878 non-null int64\n",
      "feat_70    61878 non-null int64\n",
      "feat_71    61878 non-null int64\n",
      "feat_72    61878 non-null int64\n",
      "feat_73    61878 non-null int64\n",
      "feat_74    61878 non-null int64\n",
      "feat_75    61878 non-null int64\n",
      "feat_76    61878 non-null int64\n",
      "feat_77    61878 non-null int64\n",
      "feat_78    61878 non-null int64\n",
      "feat_79    61878 non-null int64\n",
      "feat_80    61878 non-null int64\n",
      "feat_81    61878 non-null int64\n",
      "feat_82    61878 non-null int64\n",
      "feat_83    61878 non-null int64\n",
      "feat_84    61878 non-null int64\n",
      "feat_85    61878 non-null int64\n",
      "feat_86    61878 non-null int64\n",
      "feat_87    61878 non-null int64\n",
      "feat_88    61878 non-null int64\n",
      "feat_89    61878 non-null int64\n",
      "feat_90    61878 non-null int64\n",
      "feat_91    61878 non-null int64\n",
      "feat_92    61878 non-null int64\n",
      "feat_93    61878 non-null int64\n",
      "target     61878 non-null object\n",
      "dtypes: int64(94), object(1)\n",
      "memory usage: 44.8+ MB\n"
     ]
    }
   ],
   "source": [
    "#train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>feat_1</th>\n",
       "      <th>feat_2</th>\n",
       "      <th>feat_3</th>\n",
       "      <th>feat_4</th>\n",
       "      <th>feat_5</th>\n",
       "      <th>feat_6</th>\n",
       "      <th>feat_7</th>\n",
       "      <th>feat_8</th>\n",
       "      <th>feat_9</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_84</th>\n",
       "      <th>feat_85</th>\n",
       "      <th>feat_86</th>\n",
       "      <th>feat_87</th>\n",
       "      <th>feat_88</th>\n",
       "      <th>feat_89</th>\n",
       "      <th>feat_90</th>\n",
       "      <th>feat_91</th>\n",
       "      <th>feat_92</th>\n",
       "      <th>feat_93</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.00000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61878.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>30939.500000</td>\n",
       "      <td>0.38668</td>\n",
       "      <td>0.263066</td>\n",
       "      <td>0.901467</td>\n",
       "      <td>0.779081</td>\n",
       "      <td>0.071043</td>\n",
       "      <td>0.025696</td>\n",
       "      <td>0.193704</td>\n",
       "      <td>0.662433</td>\n",
       "      <td>1.011296</td>\n",
       "      <td>...</td>\n",
       "      <td>0.070752</td>\n",
       "      <td>0.532306</td>\n",
       "      <td>1.128576</td>\n",
       "      <td>0.393549</td>\n",
       "      <td>0.874915</td>\n",
       "      <td>0.457772</td>\n",
       "      <td>0.812421</td>\n",
       "      <td>0.264941</td>\n",
       "      <td>0.380119</td>\n",
       "      <td>0.126135</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>17862.784315</td>\n",
       "      <td>1.52533</td>\n",
       "      <td>1.252073</td>\n",
       "      <td>2.934818</td>\n",
       "      <td>2.788005</td>\n",
       "      <td>0.438902</td>\n",
       "      <td>0.215333</td>\n",
       "      <td>1.030102</td>\n",
       "      <td>2.255770</td>\n",
       "      <td>3.474822</td>\n",
       "      <td>...</td>\n",
       "      <td>1.151460</td>\n",
       "      <td>1.900438</td>\n",
       "      <td>2.681554</td>\n",
       "      <td>1.575455</td>\n",
       "      <td>2.115466</td>\n",
       "      <td>1.527385</td>\n",
       "      <td>4.597804</td>\n",
       "      <td>2.045646</td>\n",
       "      <td>0.982385</td>\n",
       "      <td>1.201720</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>15470.250000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>30939.500000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>46408.750000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>61878.000000</td>\n",
       "      <td>61.00000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>64.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>76.000000</td>\n",
       "      <td>43.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>76.000000</td>\n",
       "      <td>55.000000</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>67.000000</td>\n",
       "      <td>30.000000</td>\n",
       "      <td>61.000000</td>\n",
       "      <td>130.000000</td>\n",
       "      <td>52.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>87.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 94 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                 id       feat_1        feat_2        feat_3        feat_4  \\\n",
       "count  61878.000000  61878.00000  61878.000000  61878.000000  61878.000000   \n",
       "mean   30939.500000      0.38668      0.263066      0.901467      0.779081   \n",
       "std    17862.784315      1.52533      1.252073      2.934818      2.788005   \n",
       "min        1.000000      0.00000      0.000000      0.000000      0.000000   \n",
       "25%    15470.250000      0.00000      0.000000      0.000000      0.000000   \n",
       "50%    30939.500000      0.00000      0.000000      0.000000      0.000000   \n",
       "75%    46408.750000      0.00000      0.000000      0.000000      0.000000   \n",
       "max    61878.000000     61.00000     51.000000     64.000000     70.000000   \n",
       "\n",
       "             feat_5        feat_6        feat_7        feat_8        feat_9  \\\n",
       "count  61878.000000  61878.000000  61878.000000  61878.000000  61878.000000   \n",
       "mean       0.071043      0.025696      0.193704      0.662433      1.011296   \n",
       "std        0.438902      0.215333      1.030102      2.255770      3.474822   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      1.000000      0.000000   \n",
       "max       19.000000     10.000000     38.000000     76.000000     43.000000   \n",
       "\n",
       "           ...            feat_84       feat_85       feat_86       feat_87  \\\n",
       "count      ...       61878.000000  61878.000000  61878.000000  61878.000000   \n",
       "mean       ...           0.070752      0.532306      1.128576      0.393549   \n",
       "std        ...           1.151460      1.900438      2.681554      1.575455   \n",
       "min        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "25%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "50%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "75%        ...           0.000000      0.000000      1.000000      0.000000   \n",
       "max        ...          76.000000     55.000000     65.000000     67.000000   \n",
       "\n",
       "            feat_88       feat_89       feat_90       feat_91       feat_92  \\\n",
       "count  61878.000000  61878.000000  61878.000000  61878.000000  61878.000000   \n",
       "mean       0.874915      0.457772      0.812421      0.264941      0.380119   \n",
       "std        2.115466      1.527385      4.597804      2.045646      0.982385   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        1.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max       30.000000     61.000000    130.000000     52.000000     19.000000   \n",
       "\n",
       "            feat_93  \n",
       "count  61878.000000  \n",
       "mean       0.126135  \n",
       "std        1.201720  \n",
       "min        0.000000  \n",
       "25%        0.000000  \n",
       "50%        0.000000  \n",
       "75%        0.000000  \n",
       "max       87.000000  \n",
       "\n",
       "[8 rows x 94 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ab3ad10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.target);\n",
    "pyplot.xlabel('target');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡。交叉验证对分类任务缺省的是采用StratifiedKFold，在每折采样时根据各类样本按比例采样"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将类别字符串变成数字\n",
    "# drop ids and get labels\n",
    "y_train = train['target']   #形式为Class_x\n",
    "y_train = y_train.map(lambda s: s[6:])\n",
    "y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop([\"id\", \"target\"], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py:444: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n",
      "  warnings.warn(msg, DataConversionWarning)\n"
     ]
    }
   ],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "#X_test = ss_X.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/anaconda/lib/python2.7/site-packages/sklearn/model_selection/_split.py:2010: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.67      0.21      0.32       370\n",
      "          1       0.61      0.90      0.73      3205\n",
      "          2       0.52      0.25      0.34      1546\n",
      "          3       0.80      0.13      0.22       566\n",
      "          4       0.96      0.94      0.95       542\n",
      "          5       0.91      0.92      0.92      2823\n",
      "          6       0.73      0.52      0.61       572\n",
      "          7       0.85      0.91      0.88      1703\n",
      "          8       0.85      0.83      0.84      1049\n",
      "\n",
      "avg / total       0.75      0.75      0.72     12376\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[  79   48    1    0    1   43    7   93   98]\n",
      " [   1 2889  264    6    8   11   16    8    2]\n",
      " [   0 1106  385    5    1    4   33    9    3]\n",
      " [   0  392   52   74    4   34    8    2    0]\n",
      " [   0   30    1    0  510    0    0    1    0]\n",
      " [  10   61    4    4    1 2611   32   62   38]\n",
      " [   7  132   28    1    1   58  300   43    2]\n",
      " [  15   50    5    0    3   55   11 1547   17]\n",
      " [   6   54    1    2    1   46    6   59  874]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.73779896574\n",
      "accuracy: 0.745879120879\n",
      "accuracy: 0.747899159664\n",
      "accuracy: 0.748626373626\n",
      "accuracy: 0.745394311571\n",
      "accuracy: 0.703296703297\n",
      "accuracy: 0.69360051713\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEFCAYAAAAMk/uQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYVNW19/FvDT13Y1A7ooIiSpZDVIxEwTCqRCHSqDEx\nIc4YnpjcmxtvbhxyjVM0xoEYNa8xqImZ1NwoBlDBIDKoBKeYqCjLoDijtopMTQ81vH+c6qYgjRTd\nVV1D/z7P0499TtWpWtui96q99jn7hJLJJCIiIgDhfAcgIiKFQ0lBREQ6KCmIiEgHJQUREemgpCAi\nIh2i+Q6guxob13X59Km+fatZvbopm+HkTam0pVTaAWpLoSqVtnS3HfX1daHO9vfqkUI0Gsl3CFlT\nKm0plXaA2lKoSqUtuWpHr04KIiKyuZyVj8wsDNwMHAy0AGe7+4rUY/2Au9OePgS4wN1vMbO/A2tT\n+1e6+5m5ilFERDaXyzmF44FKdx9uZsOAacAkAHd/FxgDYGbDgSuBW82sEgi5+5gcxiUiIlsRytUy\nF2b2M+BJd787tf22u+++xXNCwFPAN9zdzexw4HfA6wQJ64fuvvST3icWiydLpUYoItKDOp1ozuVI\noQ+wJm07bmZRd4+l7ZsILHN3T203AdcBtwGDgTlmZlscs5luzr7T2Liuy8cXklJpS6m0A9SWQlUq\nbeluO+rr6zrdn8uksBZIf9dwJ537KcANadsvAyvcPQm8bGYfArsCb+YwThERScnl2UePAxMAUnMK\nz3fynKHAkrTtswjmHjCz3QhGG6tyGKOIiKTJ5UjhPmCcmS0hqF2daWaTgVp3n25m9cDa1Kig3e3A\nHWb2GJAEzvqk0pFIT0kmoaUF1q8PsX49rFsXYsOG4Pdg36b97b/36QP77hvlsMPiDByYJNRpBVek\nsOQsKbh7AvjWFruXpz3eSHAqavoxrcDkXMUkvUsiARs2bL3Tbt+/YUNm+2OxrvTqVQDU1yf4/Ofj\nHHZYnM9/Ps5BByWoqMhue0WyoeiXuZDS0toKH36YWae9rW/sTU1d/2oejSaprYXa2iT9+iWoqYG6\nuiS1tZv2f9LvdXVQVlbDX//azJNPRnjyyQgPPljGgw+WAVBRkWTIkHhHohg6NMHOO+uGV5J/SgrS\n45qa4LXXwqxcGebVV8OsXBnq+H3VKoDaLr1udXWSmpqgc/70pxMdHXVd3ab96R14eicfPL5pf0UF\n3S731NfDwIFtTJ3aRjIJb70V4qmnIh1J4qmnIjzxxKY/wb33TnSMJA47LM4++yQIa80B6WFKCpIT\nGzcGHf+rrwY/r70WSiWAMO+88+89XSiUZPfdk4wZA9XVbf/WadfWburYO/vGXlMD0QL+1xwKwYAB\nSQYMiHHiicE02fr18MwzkY5E8fTTEe66q4y77gpGE337Jhk6dFPJaciQONXV+WyF9AYF/GckhS69\n42//tt/+jb+zjh9g990TjBwZY+DABIMGJRg0KMleeyXYc88EVVXt514393BL8qO2FkaPjjN6dByA\neByWLw93jCKefDLCvHlR5s0L/kyj0SQHHrj5aKJfP5WcJLuUFOQTbdwIr7/e/o0/845/xIgYe+0V\ndPx77ZVk0KBNHb90LhKBAw5IcMABCc48sw2A994LdZSbnn46wnPPhXn22Qi/+lVwzB57JDYbTey/\nf4KILvCXblBSkM06/pUrN5V5glJPiGTy34vru+22qeMPOv/gG//Ager4s2mXXZJMnBhj4sSg5LRx\nI/zzn5vPS8yYUcaMGUHJqaYmyaGHBknisMPiHHponLrOL1wV6ZSSQi/R3Jw+uRtK1fnbv/FvveM/\n4oh46tv+pm/86vjzp6oKhg2LM2xYUHJKJmHFijBPPRXuSBSLF0dZvDj40w6Hk+y33+YlpwEDdM2E\nbJ2SQglpbu681LNyZZi33+684991100d/8CByVSdPyj1aFKz8IVCMHhwgsGDE0yeHIwmPvwwxNNP\nhzvmJf7xjwjLlkX4zW+CY3bZZfMkceCBCcrK8tgIKShKCkXuhRfCXHddOS+8AG++WfuJHX/7t/32\nWv/Ager4S9FOOyU55pg4xxwTjCZaW+H55zefwJ49u4zZs4NMUFUVXDPRnig+//k4ffvmswWST0oK\nRer990NcfXU5f/hDGclkiN12g+HDO//GX1OT72gln8rL4dBDExx6aIJzzgmumXjjjdBm8xJLl0b4\n2982dQef+Ux8syuwd945jw2QHqWkUGRaWuDWW8v42c8qWL8+hFmcyy5r4eSTq2ls3Jjv8KQIhEKw\n555J9twzxle+EpSc1q4NrploTxTPPBPh5Zcj/PGPwTEnnEDHGU9S2pQUikQyCXPmRLn00gpeey1M\n375JrrqqmdNPbyvoi7akOPTpA2PHxhk7Nig5xWLw0ktByWn69HL+8pcwl10W0nURvYAuoi8Cy5aF\n+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\niIh0+P+oc2o0ShzSAQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a2d0a7890>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.676955397544\n",
      "accuracy: 0.446266968326\n",
      "accuracy: 0.263332255979\n",
      "accuracy: 0.258968972204\n",
      "accuracy: 0.258968972204\n",
      "accuracy: 0.74305106658\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上述部分运行结果来看，gamma参数设置不合适（gamma越大，对应RBF核的sigma越小，决策边界更复杂，可能发生了过拟合）\n",
    "所以调小gamma值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.304217840983\n",
      "accuracy: 0.57732708468\n",
      "accuracy: 0.712831286361\n",
      "accuracy: 0.74305106658\n",
      "accuracy: 0.577650290886\n",
      "accuracy: 0.711538461538\n",
      "accuracy: 0.749838396897\n",
      "accuracy: 0.805106658048\n",
      "accuracy: 0.711296056884\n",
      "accuracy: 0.746606334842\n",
      "accuracy: 0.781512605042\n",
      "accuracy: 0.86102133161\n",
      "accuracy: 0.745879120879\n",
      "accuracy: 0.770119586296\n",
      "accuracy: 0.815449256626\n",
      "accuracy: 0.915885585003\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, -2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nv/7r9SxZcialpbaMY1p/wPXX38Dppy/t97lPPvknlJrNl750NS+++ByPPPIQX/vajYfVHhkARplY\nPMFvn9/GGxv34y0r5oYr5lFVbjv4E4XIsUAgwE9+cjNtbQEKCgq48cZvMXXqNH70ox+wf/8+wuEw\nn/nM56iurmbt2rfZsWM7P/vZHd0z3mysWbOa3/zmPoqKinC5XHznOz+gtLSUn/3sv/noow/xer3U\n1tby85/fydate5kxYyZms5lEItHvYwKBAHfd9Qvi8Titra1861vfQ6nZfP7zV3D00cewZ88eFiw4\nhUAgwAcfbGH69Bl897s/4L/+6z+xWoupq9tHNBrlrLPOYdWqN2hoOMCtt96Oz1fBT396C42NDTQ1\nNXLGGWfy5S9fA8App5zKCy88x2WXXZ7RN60/YOfOHfzhD7/jmGPmcu2111NY2LMHysaN73PVVV8B\nYOHCRTz66OGXUpMBYBTpCMe484E1rP+wgSkTHNxw+XE47dZ8N0scYVecNTPr2fqR9PDDv2HhwkX8\nwz9cyq5dn/A///Njfvzjn7FlyybuvfchDCPBunVrOfroY1mw4BQuuGD5IQX/riB+770PUV5ezh/+\n8DseeeQh5sw5mo6ODn7964dpbm7is5+9DIC3336bGTNmAfD66yv7fczOnTv4+te/ybRp03n++Wd5\n/vlnUGo2+/fv44477sHt9nD++Ut56KFHqa6u4dOfvohQKLk3SVVVFf/+79/jJz+5mYaGem677Zfc\nd99drF79BgsXnsZxxx3P8uUXEw53smLF8u4BYMaMWfzlL0/1GQBOPvlUzjxzGRMmTOTWW3/EM888\nzSWXfLr7eDAYxGazA1BaaiMYbB/iO9VDBoBRojnQyS8e30htQzvHzfBy7cXHUFwkb58YOT7+eDsb\nN67n739/HoBAoJWysjK++tVvcOutNxMKhTj//E8N+PzHHvsDr7++EoCbbvoxXm95xvHm5mbKypyU\nlyfvP/74E3jooQcoKSnh2GPnAuDxeKmpmQyA3+9n9uzk/Z98srPfx/h8FTz44P1YrVaCwXaczmRO\n3eVyU1ExAQCbzc7kyVNSX9uIRCIAKDUbALvdwdSp0wBwOMoIhyM4nS62bNnEunVrsdnsRKPR7n54\nveUEAq19+nvRRZfgcCQv2jz99CWsXv1mRv9tNlv34BMKBbHbD/8CT4kgo8DuA23c8cRG/G1hLlg0\n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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a0ebc5650>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
